import numpy as np

# 输出层激活函数
def identity_function(x):
    return x

def softmax(x):
    if x.ndim == 2:
        x = x.T 
        x = x - np.max(x,axis=0)
        y = np.exp(x)/np.sum(np.exp(x),axis=0)
        return y.T
    x = x - np.max(x)
    return np.exp(x)/np.sum(np.exp(x))

# 其它层激活函数
def sigmoid(x):
    return 1/(1+np.exp(-x))


# 交叉熵损失函数
def cross_entropy_error(y,t):
    # 如果是计算单个样本交叉熵损失，并且y,t皆为向量
    # 为了使得该函数可以计算多个样本交叉熵损失，转换向量为矩阵
    if y.ndim == 1:
        t = t.reshape(1,t.size)
        y = y.reshape(1,y.size)

    if t.size == y.size: # 表示监督数据为one-hot格式
        t = t.argmax(axis=1) # 转换为非one-hot形式
    
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size),t]+1e-7))/batch_size